#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <pthread.h>
#include <unistd.h>

// typedef void* (*func_t)(void*); // 函数指针
using func_t = std::function<void()>;

// void* ThreadRoutine(void* args)
// {
//     std::string* name = (std::string*)args;
//     while(true)
//     {
//         std::cout << "new thread: " <<  *name << std::endl;
//         sleep(1);
//     }
// }

// class ThreadData
// {
// public:
//     ThreadData(const std::string& threadName, time_t ctime, func_t func)
//     : _threadName(threadName), _ctime(ctime), _func(func)
//     {}
// public:
//     std::string _threadName;
//     time_t _ctime;
//     func_t _func;
// };
// void* ThreadRoutine(void* args)
// {
//     ThreadData* data = static_cast<ThreadData*>(args);
//     while(true)
//     {
//         std::cout << data->_threadName << " " << data->_ctime << std::endl;
//         data->_func();
//         sleep(1);
//     }
// }

// void f()
// {
//     std::cout << "执行new thread的子任务" << std::endl;
// }

// const int threadNum = 5;
// // 给线程传递参数？将参数传入void* args
// // 传递很多参数？将线程数据封装为类传入void* args
// // 如何创建多线程？用数据结构把线程组织起来进行管理
// int main() 
// {
//     pthread_t tid;
//     // pthread_create(&tid, nullptr, ThreadRoutine, nullptr);
//     // std::string threadName = "Thread1";
//     // pthread_create(&tid, nullptr, ThreadRoutine, (void*)&threadName);
//     // ThreadData* td = new ThreadData("thread1", (uint64_t)time(nullptr), f);
//     // pthread_create(&tid, nullptr, ThreadRoutine, (void*)td);

//     std::vector<pthread_t> threads;
//     for(int i = 1; i <= threadNum; i++)
//     {
//         char threadname[64];
//         snprintf(threadname, sizeof(threadname), "%s-%lu", "thread", i);
//         ThreadData* td = new ThreadData(threadname, (uint64_t)time(nullptr), f);
//         pthread_t tid;
//         pthread_create(&tid, nullptr, ThreadRoutine, (void*)td);
//         threads.push_back(tid);
//         sleep(1);
//     }
//     while(true)
//     {
//         std::cout << "main thread" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

void* routine(void* args)
{
    int cnt = 3;
    while(cnt--)
    {
        std::cout << "new thread is running, " << std::hex <<pthread_self() << std::endl;
        sleep(1);
    }
    // return 0; // 新线程退，主线程不退
    // exit(13); // 进程退出
    pthread_exit(nullptr);
}
int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, routine, nullptr);
    while(true)
    {
        std::cout << "main thread is running, "<< "new thread: " << std::hex << tid << std::endl;
        sleep(1);
    }
}